package com.coincalf.service;

import com.alicp.jetcache.anno.CacheType;
import com.alicp.jetcache.anno.Cached;
import com.baomidou.mybatisplus.service.IService;
import com.coincalf.dto.ForexAreaMarketDTO;
import com.coincalf.dto.MarketDTO;
import com.coincalf.dto.TradeAreaMarketDTO;
import com.coincalf.dto.TradeMarketDTO;
import com.coincalf.entity.Market;
import com.coincalf.framework.constants.Constant;
import com.coincalf.framework.dto.ForexMarketDTO;
import com.coincalf.framework.enums.MarketType;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableList;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;

/**
 * <p>
 * 交易对配置信息 服务类
 * </p>
 *
 * @author qiang
 * @since 2018-05-12
 */
public interface MarketService extends IService<Market>, Constant {

    /**
     * 按类型查询所有有效的交易市场（缓存2分钟）
     *
     * @param marketType 交易对类型
     * @return
     */
    @Cached(name = CACHE_KEY_MARKETS, expire = 120, cacheType = CacheType.LOCAL)
    List<MarketDTO> queryByType(MarketType marketType);

    /**
     * 查询币币交易对行情
     *
     * @return
     */
    List<TradeAreaMarketDTO> queryTradeMarkets();

    /**
     * 查询币币交易对行情
     *
     * @param areaId 交易区域ID
     * @return
     */
    TradeAreaMarketDTO queryTradeMarkets(Long areaId);

    /**
     * 查询用户收藏的币币交易市场
     * @param userId 用户ID
     * @return
     */
    List<TradeAreaMarketDTO> queryFavoriteTradeMarkets(Long userId);

    /**
     * 查询创新交易对行情
     * @return
     */
    Collection<ForexMarketDTO> queryForexMarkets();

    /**
     * 查询用户收藏的币币交易市场
     * @param userId 用户ID
     * @return
     */
    List<ForexAreaMarketDTO> queryFavoriteForexMarkets(Long userId);

    /**
     * 按交易区域查询所有有效的交易市场（缓存2分钟）
     *
     * @param areaId 交易区域ID
     * @return
     */
    @Cached(name = CACHE_KEY_AREA_MARKETS, expire = 120, cacheType = CacheType.LOCAL)
    List<Market> queryByTradeArea(long areaId);

    /**
     * 根据交易对标识符查询交易对（缓存2分钟）
     *
     * @param symbol 交易对标识符
     * @return
     */
    @Cached(name = CACHE_KEY_MARKET, expire = 120, cacheType = CacheType.LOCAL)
    Market queryBySymbol(String symbol);

    /**
     * 查询交易市场（缓存120秒）
     *
     * @param marketId 交易对ID
     * @return
     */
    @Cached(name = CACHE_KEY_MARKET, expire = 120, cacheType = CacheType.LOCAL)
    Market getMarketById(Long marketId);

    /**
     * 币币交易市场缓存实例
     *
     * @return
     */
    LoadingCache<Long, TradeMarketDTO> TRADE_MARKET_CACHE_INSTANCE();

    /**
     * 创新交易市场缓存实例
     *
     * @return
     */
    LoadingCache<Long, ForexMarketDTO> FOREX_MARKET_CACHE_INSTANCE();

    /**
     * 初始化交易市场数据
     *
     * @param market 交易对
     */
    ForexMarketDTO initForexMarket(Market market);

    /**
     * 获取保证金基础汇率
     *
     * @param market 交易对ID
     * @param price  当前卖一价
     * @return
     */
    BigDecimal getBaseMargin(Market market, BigDecimal price);

    /**
     * 获取交易对价格信息
     *
     * @param marketId 交易对Id
     * @return
     */
    ForexMarketDTO getMarketDataById(Long marketId);

    /**
     * 基础货币兑（USDT或BTC）汇率
     *
     * @param market 交易对
     * @return
     */
    BigDecimal getBaseToCoinRate(Market market);

    /**
     * 报价货币兑（USDT或BTC）汇率
     *
     * @param market 交易对
     * @return
     */
    BigDecimal getPriceToCoinRate(Market market);

    /**
     * 计算人民币价格
     *
     * @param market 交易对
     * @return
     */
    BigDecimal getCnyPrice(Market market);

    /**
     * 按类型查询所有有效的交易市场（缓存2分钟）
     *
     * @param trade 交易对类型
     * @return
     */
    ImmutableList<TradeMarketDTO> queryByType(MarketType trade, String marketIds);
}
